//	Configure ADS5294
//
//  SPI data format for ADS5294
//  |R/W|W1|W0|A12|A11|A10|A9|A8|A7|...|D5|D4|D3|D2|D1|D0| 
//  
//  @2023-10-27: 增加对寄存器0XD1的配置，该寄存器在使用decimation时进行配置；寄存器数量增加至38
//  @2023-10-06：若采用预设的滤波配置，就不需要对那96个寄存器进行配置

#include "SPI.h"

#ifndef _ADS5294_H_
#define _ADS5294_H_

// #define _ADS5294_SPI_REG_NUM_   37      // Total number of regs in Table 17 of ADS5294 datasheet
#define _ADS5294_SPI_REG_NUM_   38      // Total number of regs in Table 17 of ADS5294 datasheet
// #define _ADS5294_DEC_REG_NUM_   96      // 用于配制decimation的96个寄存器
// #define _DEC_REG_IDX_START_     37      // 96个decimation寄存器中第一个的下标
// #define _DEC_REG_IDX_END_       132     // 96个decimation寄存器中最后一个的下标

// 因为SPI一次发送的bits数已经在SPI_CONFIG中根据芯片名称进行了配置,所以此处不需要再做处理
typedef struct _ADS5294_Config{
    int reg_num;            // = 37
    int decimation_opt;     // 默认值设为-1，表示不启用（预设的）decimation功能
    uint32_t *reg_flag;     // if labeled with 0, the corresponding register will NOT be configured via SPI.
    uint32_t *reg_addr;     // register addresses
    uint32_t *reg_data;     // data to be written into the registers
    uint32_t *reg_data_def; // 保存寄存器默认值

    char dump_dir[1024];    // 保存用于输出参数配置文件的路径
} ADS5294_Config;

//  对默认的配置参数数据结构进行内存分配
void allocate_ads5294_config( ADS5294_Config *cfg );

//  对"调节模式"的配置参数数据结构分配内存
void allocate_ads5294_config_adj( ADS5294_Config *cfg, int reg_num );


void dump_ads5294_config( ADS5294_Config *cfg, char *dump_filename );


void free_ads5294_config( ADS5294_Config *cfg );

//  initialize to default settings
int set_ads5294_config_default( ADS5294_Config *cfg, char *inifile, char *section );

//  load ADS5294 configuration data from *inifile, the returned integer is the total number
//  of registers that will be configured via SPI
int read_ads5294_config( ADS5294_Config *cfg, char *inifile, char *section );

//  print ADG714 configurations for debug
int print_ads5294_config( ADS5294_Config *cfg );

//  update configuration for a given reg_addr with value reg_data
int update_ads5294_config( ADS5294_Config *cfg, uint32_t reg_addr, uint32_t reg_data );


uint32_t config_ads5294_via_SPI( uint32_t *gpio_reg, 
					             uint32_t *gpio2_reg, 
					             uint32_t *gpio_in_reg,
					             SPI_CONFIG *spi_config,
					             ADS5294_Config *cfg
					            );


void stop_ads5294_clk( uint32_t *gpio_reg );
void start_ads5294_clk( uint32_t *gpio_reg );

//  对一些常用的控制功能做函数封装：
void power_on_ads5294(  uint32_t *gpio_reg,
                        uint32_t *gpio2_reg,
                        SPI_CONFIG *spi_config,
                        ADS5294_Config *cfg );

void power_off_ads5294( uint32_t *gpio_reg,
                        uint32_t *gpio2_reg,
                        SPI_CONFIG *spi_config,
                        ADS5294_Config *cfg );

int config_ads5294_decimation( ADS5294_Config *cfg, int opt );

#endif
